#include "Reactor_server.h"
#include "protocol.hpp"
#include "calculate.hpp"
#include "Listen_Connection.h"


int main(int argc, char* argv[])
{
    //./Reactor_Server [server_port]
    if(argc != 2)
    {
        std::cout << "usage: " << argv[0] << " [server_port]" << std::endl;
        exit(USAGE_ERR);
    }

    uint16_t server_port = static_cast<uint16_t>(std::stoi(argv[1]));
    
    //1. 应用层: 实际应用
    std::unique_ptr<calculate> cal_p = std::make_unique<calculate>();

    //2. 会话层: 数据格式管理 -- 协议
    std::unique_ptr<protocol> ptl_p = std::make_unique<protocol>([&cal_p](const request& req) ->response
                                                                 {
                                                                     return cal_p->execute(req);
                                                                 }
                                                                );

    //3. 表示层: 通信管理 -- reactor_server
    //(3.1). 建立listen_connection
    std::shared_ptr<connection> listen_con_p = std::make_shared<listen_connection>(server_port);
    //(3.2). 向listen_connection中注册io处理函数
    listen_con_p->register_io_handle_func([&ptl_p](std::string& in_buffer) ->std::string
                                          {
                                               LOG(wzx::log_level::DEBUG) << "io_connection调用进入回调函数, 开始处理读入数据流...";
                                               std::string out_buffer;//如果
                                               ptl_p->data_stream_handler(in_buffer, out_buffer);//如果in_buffer里粘连了多个报文, 也可一次性处理完成
                                               return out_buffer;
                                          }
                                         );
    //(3.3). 建立reactor_server
    std::unique_ptr<reactor_server> rs_p = std::make_unique<reactor_server>();
    //(3.4). 向reactor_server里插入listen_connection
    rs_p->insert_connection(listen_con_p);
    //(3.5). 启动
    rs_p->start();

    
    return 0;
}